package nusarPruebas


class AutentificadorController {

	def passwordEncoder
	
//	def springSecurityService
	def index() {}
	
	/*
	 * Verifica si el correo y password introducidos
	 * por el usuario, son correctos.
	 */
	def validarDatos(){

		println "Password codificado: " + params.password
		
		// Checamos si el usuario es un alumno
		def usuario = Alumno.findByCorreo(params.correo)
		
		// Tipo de usuario
		String tipo
		
		// Se cambia a "true" si el password es valido
		boolean esValido = false
		// Si no se encontro en la BD de alumnos
		if(usuario == null)
		{
			
			// Checamos si el usuario es un coordinador
			usuario = Coordinador.findByCorreo(params.correo)
			
						
			tipo = "Coordinador"
		}
		else
			tipo = "Alumno"
			
			
		// Se verifica si se ha encontrado a un usuario
		if(usuario != null)
		{		
			// Se checa si el password encriptado que se recibe es valido
			esValido = passwordEncoder.isPasswordValid(params.password, usuario.password, usuario.correo)
		//	esValido = usuario.password.equals(params.password) ? true : false
			println "Valido: " + esValido
		}
		
		render esValido==true ? tipo + " " + usuario.id : "Error"
	}

	/*
	 * Manda llamar un metodo para obtener toda la
	 * informacion del usuario, segun su tipo.
	 */
	def getUsuario(){
		
		if(params.tipo.equalsIgnoreCase("Alumno"))
		{
			render(contentType: "text/json") { infoAlumno(params.id.toLong())}
		}
		else
			render(contentType: "text/json") { infoCoordinador(params.id.toLong()) }
	}

	
	/*
	 * Obtiene toda la informacion del alumno:
	 * informacion general, materias y cardex.
	 */
	def infoAlumno(long identificador){
		
		Alumno alumno = Alumno.get(identificador)
		
		
		// HashMap que contendra la informacion de las materias que esta cursando el alumno
		HashMap<Integer, Object> materias = new HashMap<Integer, Object>();
		
		
		def cursando = Alumno_Materias.findAllByAlumnoAndEstado(alumno, "Cursando")
		for(Materia materia : cursando.materia)
		{
			
			// HashMap que contendra la informacion de una materia
			HashMap auxMateria = ["id"		 : materia.id,
								  "nombre"	 : materia.nombre,
								  "grupo"	 : materia.grupo,
								  "subgrupo" : materia.subgrupo,
								  "tipo"	 : materia.tipo,
								  "cupo"	 : materia.cupo,
								  "salon"	 : materia.salon]
			
			// Calculamos las vacantes que tiene la materia			
			auxMateria.put("vacantes", (materia.cupo - materia.alumnos.size()) )

			// HashMap que contendra el horario de una materia
			HashMap<String, Object> diasHoras = new HashMap<String, Object>()
			
			diasHoras.put("Lunes", 	  "")
			diasHoras.put("Martes",	  "")
			diasHoras.put("Miercoles","")
			diasHoras.put("Jueves",   "")
			diasHoras.put("Viernes",  "")
			diasHoras.put("Sabado",   "")
			
			for(DiaHora diahora : materia.diashoras)
				diasHoras.put(diahora.dia, ""+diahora.horaInicio+":00 - "+diahora.horaFinal+":00")
				
			// Agregamos el horario
			auxMateria.put("diashoras", diasHoras)

			// Agregamos una materia al HashMap
			materias.put(materia.id, auxMateria)
		}
		
		// Hashmap que contendra las id's de las materias que ya curso el alumno
		HashMap<Integer, String> cardex = new HashMap<Integer, String>()
		
		def aprobadas = Alumno_Materias.findAllByAlumnoAndEstado(alumno, "Aprobada")
		for(Materia materia : aprobadas.materia)
		{
			cardex.put(materia.id, materia.nombre)
		}
		// Informacion general del alumno
		HashMap infoAlumno = ["nombre":alumno.nombre,
						      "matricula":alumno.matricula,
							  "carrera":alumno.carrera,
							  "coordinador":alumno.coordinador,
							  "tutor":alumno.tutor,
							  "estatus": alumno.estatus]
		
		
		// Toda la informacion del alumno
		HashMap<String, Object> alumnoMap = ["infoAlumno": infoAlumno,
											   "materias": materias,
											   "cardex" : cardex]
		

		println "---------------------"
		println "-----Informacion-----"
		println "---------------------"
		println "Nombre: " 	  + alumnoMap.infoAlumno.nombre
		println "Matricula: " + alumnoMap.infoAlumno.matricula
		println "Carrera: "   + alumnoMap.infoAlumno.carrera
		println "Coordinador: " + alumnoMap.infoAlumno.coordinador
		println "Tutor: "	  + alumnoMap.infoAlumno.tutor
		println "Estatus: "	  + alumnoMap.infoAlumno.estatus
		
		for(Object key : alumnoMap.materias.keySet())
		{
			println "---------------------"
			println "-------Materia-------"
			println "---------------------"
			
			println "Id: " 		+ alumnoMap.materias[key].id
			println "Nombre: " 	+ alumnoMap.materias[key].nombre
			println "Grupo: " 	+ alumnoMap.materias[key].grupo
			println "Subgrupo: "+ alumnoMap.materias[key].subgrupo
			println "Tipo: " 	+ alumnoMap.materias[key].tipo
			println "Cupo: " 	+ alumnoMap.materias[key].cupo
			println "Salon: "	+ alumnoMap.materias[key].salon
			println "Vacantes: "+ alumnoMap.materias[key].vacantes
			
			println "---------------------"
			println "-------Horario-------"
			println "---------------------"
			
			println "lunes: " + alumnoMap.materias[key].diashoras.Lunes
			println "martes: " + alumnoMap.materias[key].diashoras.Martes
			println "miercoles: " + alumnoMap.materias[key].diashoras.Miercoles
			println "jueves: " + alumnoMap.materias[key].diashoras.Jueves
			println "viernes: " + alumnoMap.materias[key].diashoras.Viernes
			println "sabado: " + alumnoMap.materias[key].diashoras.Sabado
		}
		
		println "---------------------"
		println "-------Cardex--------"
		println "---------------------"
		
		for(Object key : alumnoMap.cardex.keySet())
		{
			println "Materia: " + alumnoMap.cardex[key]
		}
		
		return alumnoMap
	}

	
	/*
	 * Obtiene la informacion basica del coordinador
	 */
	def infoCoordinador(long identificador){
		
		Coordinador coordinador = Coordinador.get(identificador)
		
		// Informacion general del coordinador
		HashMap coordMap = ["numTrabajador"  :	coordinador.numTrabajador,
					 		"nombre"		  :	coordinador.nombre,
							 "carrera"		  :	coordinador.carrera]
		
		println "---------------------"
		println "-----Informacion-----"
		println "---------------------"
		println "NumTrabajador: " + coordMap.numTrabajador
		println "Nombre: " 	  	  + coordMap.nombre
		println "Carrera: "   	  + coordMap.carrera
		
		return coordMap
	}
	
	/*
	 * Obtiene todas las materias de la BD
	 */
	def getAllMaterias(){
		
		// HashMap que contendra la informacion de todas las materias del alumno
		HashMap<Integer, Object> materias = new HashMap<Integer, Object>();
		
		for(Materia materia : Materia.all)
		{
			
			// HashMap que contendra la informacion de una materia
			HashMap auxMateria = ["id"		 : materia.id,
								  "nombre"	 : materia.nombre,
								  "grupo"	 : materia.grupo,
								  "subgrupo" : materia.subgrupo,
								  "tipo"	 : materia.tipo,
								  "cupo"	 : materia.cupo,
								  "salon"	 : materia.salon]
			
			
			// Calculamos las vacantes que tiene la materia
			auxMateria.put("vacantes", (materia.cupo - materia.alumnos.size()) )

			// HashMap que contendra el horario de una materia
			HashMap<String, Object> diasHoras = new HashMap<String, Object>()
			
			diasHoras.put("Lunes", 	  "")
			diasHoras.put("Martes",	  "")
			diasHoras.put("Miercoles","")
			diasHoras.put("Jueves",   "")
			diasHoras.put("Viernes",  "")
			diasHoras.put("Sabado",   "")
			
			for(DiaHora diahora : materia.diashoras)
				diasHoras.put(diahora.dia, ""+diahora.horaInicio+":00 - "+diahora.horaFinal+":00")
				
			// Agregamos el horario
			auxMateria.put("diashoras", diasHoras)

			// Agregamos una materia al HashMap
			materias.put(materia.id, auxMateria)
		}	
		
		for(Object key : materias.keySet())
		{
			println "---------------------"
			println "-------Materia-------"
			println "---------------------"
			
			println "Id: " 		+ materias[key].id
			println "Nombre: " 	+ materias[key].nombre
			println "Grupo: " 	+ materias[key].grupo
			println "Subgrupo: "+ materias[key].subgrupo
			println "Tipo: " 	+ materias[key].tipo
			println "Cupo: " 	+ materias[key].cupo
			println "Salon: "	+ materias[key].salon
			println "Vacantes: "+ materias[key].vacantes
			
			println "---------------------"
			println "-------Horario-------"
			println "---------------------"
			
			println "lunes: " + materias[key].diashoras.Lunes
			println "martes: " + materias[key].diashoras.Martes
			println "miercoles: " + materias[key].diashoras.Miercoles
			println "jueves: " + materias[key].diashoras.Jueves
			println "viernes: " + materias[key].diashoras.Viernes
			println "sabado: " + materias[key].diashoras.Sabado
		}
		
		
		render(contentType: "text/json") { materias }
	}
	
	
	/*
	 * Obtiene el correo de un alumno en particular
	 */
	def correoAlumno(){
		
		def alumno = Alumno.get(params.matricula)
		
		render alumno==null ? null : alumno.correo	
	}
	
	
	/*
	 * Regresa el numero de materias en la BD
	 */
	def numMaterias(){
		
		render Materia.count()
	}
}
